package top.minuy.subject.leetcode._203;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 *
 * @author Minuy
 * @time 00:28
 * @date 2021/8/24
 */
class Solution {
    // 使用递归解决
    public ListNode recursive(ListNode head, int val){
        if(head!=null){

            head.next = recursive(head.next, val);

            if(head.val == val){
                return head.next;
            }else {
                return head;
            }
        }
        return null;
    }
    // 使用虚拟头结点解决
    public ListNode dummyHead(ListNode head, int val) {
        // 虚拟头节点
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;

        ListNode cur = dummyHead;
        while (cur.next!=null){
            if(cur.next.val == val){
//                ListNode delNode = cur.next;
//                cur.next = cur.next.next;
//                delNode.next = null;
                // 内存自动回收，这样解决
                cur.next = cur.next.next;
            }else {
                cur = cur.next;
            }
        }
        // 返回头结点
        return dummyHead.next;
    }

    // 使用一般方法解决
    public ListNode normal(ListNode head, int val) {
        // 每次节点不能为空，可能删除一个就空了，下一个判断会空指针异常
        while (head != null && head.val == val) {
//                ListNode delNode = head;
//                head = delNode.next;
//                delNode.next = null;
            // 自动内存处理，直接跳过就好
            head = head.next;
        }

        // 考虑到所有元素在头结点被删除
        if (head == null) {
            return null;
        }

        for (ListNode cur = head; cur.next != null; ) {
            // 如果指针的下一个节点是要被删除的
            if (cur.next.val == val) {
//                    ListNode delNode = cur.next;
//                    cur.next = cur.next.next;
//                    delNode.next = null;
                // 内存自动回收，直接跳过
                cur.next = cur.next.next;
            } else {
                // 如果每次执行会跳过连续被删除的节点
                cur = cur.next;
            }
        }
        return head;
    }

    public ListNode removeElements(ListNode head, int val) {
        return recursive(head,val);
    }

}
